﻿//================================================
//
//                       _oo0oo_
//                      o8888888o
//                      88" . "88
//                      (| -_- |)
//                      0\  =  /0
//                    ___/`---'\___
//                  .' \\|     |// '.
//                 / \\|||  :  |||// \
//                / _||||| -:- |||||- \
//               |   | \\\  -  /// |   |
//               | \_|  ''\---/''  |_/ |
//               \  .-\__  '-'  ___/-. /
//             ___'. .'  /--.--\  `. .'___
//          ."" '<  `.___\_<|>_/___.' >' "".
//         | | :  `- \`.;`\ _ /`;.`/ - ` : | |
//         \  \ `_.   \_ __\ /__ _/   .-` /  /
//     =====`-.____`.___ \_____/___.-`___.-'=====
//                       `=---='
//
//
//     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
//               佛祖保佑         永无BUG
//
//
//
//================================================
//
// Created by Huiyi on 2022/11/17
//
//@模块名称 易炫彩WO服务器套件
//@版本   1.4
//@日期   2023-02-11
//@作者   Huiyi
//@模块备注 WO服务器套件
// 基于OATPP深度封装,用于快速敏捷开发WebAPI
// 相关问题可进群,易炫彩研究室Q:594165459
// 文档:http://dwiki.hyiy.top/@weboat

#pragma once

#ifndef XL_XEXPAND_DWEBX_H
//@隐藏{
#define XL_XEXPAND_DWEBX_H
class WoHTTPIncomingRequestClass;
class WoHTTPOutgoingResponseClass;
class WoHTTPContext;
class WoMultipartData;
#include "nlohmann/json.hpp"
#include <fstream>
#include <utility>
//#include <any>

#ifndef WO_MOUDLE
#ifdef _WIN64
#define WO_MOUDLE
typedef int64_t WOPTR;
#else
#define WO_MOUDLE
typedef int32_t WOPTR;
#endif
#endif // !WO_MOUDLE
#pragma warning(disable: 4503)
#pragma warning(disable:4251)
//@隐藏}

//@解析头文件
#include "WoSqlBuilder.h"
//@解析头文件
#include "WoSqlOrm.h"

#ifdef XC_MODUL
#include "module_base.h"
//#include "oatpp\web\mime\multipart\Part.hpp"
#include <memory>
//#include "redisconnect/RedisConnect.h"
#else
#endif //  XC_MODUL

#define WEBOAT_API __cdecl

#ifdef WEBOAT_EXPORTS
#ifndef  WEBOAT_MODIFICATION
#define WEBOAT_MODIFICATION __declspec(dllexport)
#endif
#include "packingClass.h"
#include "oatpp\web\mime\multipart\PartList.hpp"
#else

#include <memory>
/*@声明
#define WEBOAT_MODIFICATION
*/
#ifndef WEBOAT_MODIFICATION
#define WEBOAT_MODIFICATION __declspec(dllimport)
#endif
//@隐藏{
class WoRequestHandler;

namespace oatpp {
	namespace data {
		namespace share {
			template<class label>
			class LazyStringMultimap {};
			class StringKeyLabel {};
		};
	};
	namespace web {
		namespace server {
			class HttpRequestHandler {

			};
			class HttpRouter {};
			class HttpConnectionHandler {};
		};
		namespace protocol {
			namespace http {
				class Status{};
				namespace incoming {
					class Request {};
				};
				namespace outgoing {
					class Response {};
				};
			};
		};
		namespace mime {
			namespace multipart {
				class Part {};
			};
		};
	};
	namespace network {
		namespace tcp {
			namespace server {
				class ConnectionProvider {};
			};
		};
		class Server { };
		class Url {
			class Parameters {};
		};
	};
};
class WoOutgoingBody {};
namespace inja {
	class Environment{};
	using json = nlohmann::json;
};
class WoHTTPParseUrl{};

//@隐藏}

#endif // WEBOAT_EXPORTS


#ifdef  _WIN64
	#ifdef _DEBUG
		// WIN64 - Debug
		//@lib "lib\x64\WebOatd.lib"
		//@复制文件 @当前模块路径 "lib\x64\WebOatd.dll"
	#else
		// WIN64 - Release
		//@lib "lib\x64\WebOat.lib"
		//@复制文件 @当前模块路径 "lib\x64\WebOat.dll"
	#endif
#else
	#ifdef _DEBUG
		// WIN32 - Debug
		//@lib "lib\x86\WebOatd.lib"
		//@复制文件 @当前模块路径 "lib\x86\WebOatd.dll"
	#else
		// WIN32 - Release
		//@lib "lib\x86\WebOat.lib"
		//@复制文件 @当前模块路径 "lib\x86\WebOat.dll"
	#endif
#endif

//@src "WebServerCore.cpp"




//@分组{  数据类型
//@隐藏{
typedef nlohmann::json WoJson;
//@隐藏}

/*@声明
//@别名 WoJSON
class WoJson {
public:

	//@参数 默认值 
	//@参数 键名 值对应的键名
	//@别名 取值(键名,默认值)
	WoJson& value(const char* key, any defaultValue);
	
};
*/


/*@声明
//@别名 Http路由指针
class WoHttpRouterPtr{};
//@别名 Http连接处理指针
class WoHttpConnectHanderPtr{};
//@别名 Http连接提供者指针
class WoHttpServerConnectionProviderPtr{};
//@别名 Web服务器指针
class WoServerPtr{};
//@别名 Web路由回调指针
class WoRequestHandlerPtr{};
//@别名 Web传入请求指针
class WoHTTPIncomingRequestPtr{};
//@别名 Web传出回复指针
class WoHTTPOutgoingResponsePtr{};
//@别名 Web状态码
class WoHTTPStatus{};
//@别名 Wo模板数据集
typedef WoJson WoTemplateJson;
//@别名 Wo模板渲染器
class WoTemplateEnvironment{};
*/
typedef oatpp::data::share::LazyStringMultimap<oatpp::data::share::StringKeyLabel> WoHttpBodyMap;

//@别名 Wo客户连接信息
struct WoClientConnectInfo {
	//@别名 Wo客户连接IP类型
	enum WoClientConnectAddressFormat
	{
		//@别名 IPV4
		IPV4,
		//@别名 IPV6
		IPV6,
	};
	//@别名 IP类型
	WoClientConnectAddressFormat IPType;
	//@别名 IP
	CXTextA IP;
	//@别名 端口
	UINT32 Port = 0;
};

//@隐藏{
//@备注 只要出现错误就会回调到这个函数,拥有默认状态码
//@别名 Web_回调原型_HTTP错误回调(请求上下文)
typedef void (WEBOAT_API* WoHTTPHanderErrorFunc)(WoHTTPContext&);
#ifndef WOPTRDEFINE
#define WOPTRDEFINE
//@别名 Http路由指针
typedef std::shared_ptr<oatpp::web::server::HttpRouter> WoHttpRouterPtr;
//@别名 Http连接处理指针
typedef std::shared_ptr<oatpp::web::server::HttpConnectionHandler> WoHttpConnectHanderPtr;
//@别名 Http连接提供者指针
typedef std::shared_ptr<oatpp::network::tcp::server::ConnectionProvider> WoHttpServerConnectionProviderPtr;
//@别名 Web服务器指针
typedef std::shared_ptr<oatpp::network::Server> WoServerPtr;
//@别名 Web路由回调指针
typedef std::shared_ptr<WoRequestHandler> WoRequestHandlerPtr;
//@别名 Web传入请求指针
typedef std::shared_ptr<oatpp::web::protocol::http::incoming::Request> WoHTTPIncomingRequestPtr;
//@别名 Web传出回复指针
typedef std::shared_ptr<oatpp::web::protocol::http::outgoing::Response> WoHTTPOutgoingResponsePtr;
//@别名 Web状态码
typedef oatpp::web::protocol::http::Status WoHTTPStatus;
//@别名 Wo模板渲染器
typedef std::shared_ptr<inja::Environment> WoTemplateEnvironment;
//@别名 Wo模板渲染数据
typedef WoJson WoTemplateJson;
#endif
//@隐藏}


//@分组}

//@解析头文件
#include "WoDLLExport.h"

//@分组{  回调原型

//@别名 Web_回调原型_路由回调(请求上下文)
typedef void (WEBOAT_API* WoHTTPHanderFunc)(WoHTTPContext&);
/*@声明

//@备注 只要出现错误就会回调到这个函数,拥有默认状态码
//@别名 Web_回调原型_HTTP错误回调(请求上下文)
typedef void (WEBOAT_API* WoHTTPHanderErrorFunc)(WoHTTPContext&);

*/


//@分组}
//@分组{  封装类

#include "WoRequest.h"
#include "WoResponse.h"

//@别名 Wo路由空间
class WEBOAT_MODIFICATION WoHttpRouterHandle {
public:
    virtual void GET(WoHTTPContext&) {};
    virtual void POST(WoHTTPContext&) {};
    virtual void HEAD(WoHTTPContext&) {};
    virtual void PUT(WoHTTPContext&) {};
    virtual void PATCH(WoHTTPContext&) {};
    virtual void DELETE_(WoHTTPContext&) {};
    virtual void OPTIONS(WoHTTPContext&) {};
    virtual void CONNECT(WoHTTPContext&) {};
    virtual void TRACE(WoHTTPContext&) {};
};

//@别名 WoMultipart数据
class WoMultipartData {
	//@隐藏{
	std::shared_ptr<oatpp::web::mime::multipart::Part> m_partPtr;
	//@隐藏}
public:
	CXTextA FileName;
	CXTextA Location;
	//@隐藏{
	auto Get() { return m_partPtr; };
  WoMultipartData() = default;
	WoMultipartData(std::shared_ptr<oatpp::web::mime::multipart::Part> partPtr) :m_partPtr(partPtr) {
		FileName = WoMultipartGetFilename(this);
		Location = WoMultipartGetLocation(this);
	};
//  operator std::shared_ptr<oatpp::web::mime::multipart::Part>& () {
//    return m_partPtr;
//  };
//  // 重载赋值
//  void operator=(std::shared_ptr<oatpp::web::mime::multipart::Part>& ptr) {
//    m_partPtr = ptr;
//  };
  // 重载拷贝
  WoMultipartData(const WoMultipartData& other) {
    m_partPtr = other.m_partPtr;
    FileName = other.FileName;
    Location = other.Location;
  };
  // 重载拷贝赋值
  WoMultipartData& operator=(const WoMultipartData& other) = default;

	//@隐藏}

	//@返回 对应的本地文件路径(不一定会有实体文件)
	//@别名 取本地路径()
	const CXTextA& GetLocation() {
		return Location;
	};
	//@返回 上传时设置的名称(可能为空)
	//@别名 取上传名称()
	const CXTextA& GetFileName() {
		return FileName;
	};
	//@备注 如果获取失败会返回空
	//@返回 获取数据
	//@别名 取数据()
	CXBytes GetData() {
		CXBytes ret;
		std::ifstream file(Location);
		if (!file.is_open()) {
			return ret;
		}
		file.seekg(0, std::ios::end);
		std::streampos fileSize = file.tellg();
		file.seekg(0, std::ios::beg);
		std::vector<char> tmp(fileSize,0);
		file.read(tmp.data(), fileSize);
		ret.add(tmp.data(), fileSize);
		return ret;
	};

};

//@隐藏{

//回调调度器
struct WoHttpControllerModel {
	int model = 0; //0为function,1为class
	WoHTTPHanderFunc func = nullptr;
	std::shared_ptr<WoHttpRouterHandle> routerHandle = nullptr;
	WoHttpControllerModel() { };
	WoHttpControllerModel(int m, WoHTTPHanderFunc f, WoHttpRouterHandle* r) {
		model = m;
		func = f;
		routerHandle.reset(r);
	};
	WoHttpControllerModel(int m, void* f, void* r) {
		model = m;
		func = (WoHTTPHanderFunc)f;
		routerHandle.reset((WoHttpRouterHandle*)r);
	};
};


//@隐藏}

//@别名 Wo路由组
class WoHttpGroup {
private:
	std::string m_root; //根路由,表示路由分组
	CXVector<void*> m_middlewarelist; //中间件路由
public:
	//@隐藏{
	WoHttpGroup() { m_root = "/"; };
	WoHttpGroup(const char* root) {
		handlePath(root, m_root);
	};
	//处理路径 最前面没有/加上,后面有/删掉
	static void handlePath(const char* path, std::string& ret) {
		//3种情况为根路径
		ret = path == NULL ? "" : path;
		if (path == "/" || path == "") {
			ret = "/";
			return;
		}
		if (ret[0] != '/') {
			ret = "/"+ret;
		}
		if (ret[ret.length() - 1] == '/' && ret.length()>1) { ret[ret.length() - 1] = '\0'; }
	};
	//@别名 批量注册中间件(路由回调)
	void Uses(void** CallFuncs,int num) {
		for (int i = 0; i < num; i++) {
			m_middlewarelist.add(CallFuncs[i]);
		}
	}
	void GetUseList(CXVector<void*>& ret) {
		ret.clear(); ret.getVector()->assign(
			m_middlewarelist.getVector()->begin(),
			m_middlewarelist.getVector()->end()
		);
	};
	//@隐藏}

	//@别名 取分组路径()
	CXTextA GetGroupPath() { return m_root ; };

	//@别名 注册中间件(路由回调)
	void Use(void* CallFunc) { m_middlewarelist.add(CallFunc); }

	//@备注 将此分组复制分离并创建新组
	//@别名 创建分组(路径)
	WoHttpGroup Group(const char* path) {
		std::string lpath;
		handlePath(path, lpath);
		if (lpath=="/") {
			lpath = "";
		}
		lpath = m_root + lpath;
		WoHttpGroup r(lpath.c_str());
		if (m_middlewarelist.size()>0) {
			r.Uses(&m_middlewarelist[0], m_middlewarelist.size());
		}

		return r;
	};

	//@别名 置分组路径(路径)
	void SetRootPath(const char* path) {
		handlePath(path, m_root);
	}

};

//@别名 Wo服务器类
class WoServerClass {
private:
	WoHttpRouterPtr m_router;
	WoHttpConnectHanderPtr m_ConnectionHandler;
	WoHttpServerConnectionProviderPtr m_ConnectionProvider;
	WoServerPtr m_Server;
public:
	//@隐藏{
	WoServerClass(WoHttpRouterPtr a, WoHttpConnectHanderPtr b) {
		m_router = a;// WoCreateRouter();
		m_ConnectionHandler = b;// WoCreateHttpConnectionHander(m_router);
#ifdef WEBOAT_EXPORTS
		WoHTTPSetErrorHander(m_router,GlobalHandlerError);
#endif
	};
	~WoServerClass() { //Stop();
	};
	void regRouter(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group, WoHTTPMethod method) {
		std::string lpath;
		WoHttpGroup::handlePath(path, lpath);
		CXVector<WoHttpControllerModel>llist;
		//当有路由的时候拼接路由
		if (group != NULL) {
			lpath = group->GetGroupPath() + lpath;
			CXVector<void*> ulist;
			group->GetUseList(ulist);
			for (auto func : *ulist.getVector()) {
				llist.add(WoHttpControllerModel(0, func, nullptr));
			}
			if (lpath.substr(0, 2) == "//") {
				lpath = lpath.substr(1, lpath.length());
			}
		}
		llist.add(WoHttpControllerModel(0, CallFunc, nullptr));
		WoRegisterRouter(m_router, method, lpath.c_str(), WoCreateRequestHandlerEx(llist),nullptr);
	};
	//@隐藏}

	/*@声明
	//@参数 绑定主机 例如127.0.0.1 或 0.0.0.0
	//@参数 端口 例如8090
	//@参数 IP类型 指定IP4或者IP6或者不指定
	//@别名 绑定(绑定主机,端口,IP类型)
	void Bind(const char* host, int port, WoNetworkAddress IpAddress);

	//@备注 使用类空间来批量注册同一条请求,注意:只会注册重写的类,请规范使用注册
	//@参数 控制类 重写 Wo路由空间 类后传递
	//@别名 注册类控制器(路由路径,控制类,路由分组)
	void ApiController(const char* path,通用型 controllerClass, WoHttpGroup* group = NULL);
	*/
	//@隐藏{
	void Bind(const char* host, int port, WoNetworkAddress IpAddress = WoNetworkAddress::UNSPEC) {
		m_ConnectionProvider = WoCreateConnectionProvider(host, port, int(IpAddress));
		m_Server = WoCreateServer(m_ConnectionProvider, m_ConnectionHandler);
	};
	template<typename T>
	void ApiController(const char* path, T, WoHttpGroup* group = NULL) {
		std::string lpath;
		WoHttpGroup::handlePath(path, lpath);
		CXVector<WoHttpControllerModel>llist;
		auto cmPtr = new T;
		//当有路由的时候拼接路由
		if (group != NULL) {

			lpath = group->GetGroupPath() + lpath;
			CXVector<void*> ulist;
			group->GetUseList(ulist);
			for (auto func : *ulist.getVector()) {
				llist.add(WoHttpControllerModel(0, func, nullptr));
			}
			if (lpath.substr(0, 2) == "//") {
				lpath = lpath.substr(1, lpath.length());
			}
		}
		llist.add(WoHttpControllerModel(1, nullptr, cmPtr));
		if (!std::is_same<decltype(&WoHttpRouterHandle::GET), decltype(&T::GET)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_GET, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::POST), decltype(&T::POST)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_POST, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::HEAD), decltype(&T::HEAD)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_HEAD, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::PUT), decltype(&T::PUT)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_PUT, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::PATCH), decltype(&T::PATCH)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_PATCH, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::DELETE_), decltype(&T::DELETE_)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_DELETE, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::OPTIONS), decltype(&T::OPTIONS)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_OPTIONS, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::CONNECT), decltype(&T::CONNECT)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_CONNECT, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
		if (!std::is_same<decltype(&WoHttpRouterHandle::TRACE), decltype(&T::TRACE)>::value) {
			WoRegisterRouter(m_router, WoHTTPMethod::_TRACE, lpath.c_str(), WoCreateRequestHandlerEx(llist), (void*)typeid(T).name());
		}
	};
	//@隐藏}



	//@备注 GET路由 向服务器获取资源，比如常见的查询请求
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 GET(路由路径,回调函数,路由分组)
	void GET(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _GET);
	};

	//@备注 POST路由 向服务器提交数据而发送的请求
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 POST(路由路径,回调函数,路由分组)
	void POST(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _POST);
	};
	//@备注 HEAD路由 和get类似，返回的响应中没有具体的内容，用于获取报头
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 HEAD(路由路径,回调函数,路由分组)
	void HEAD(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _HEAD);
	};
	//@备注 PUT路由 一般是用于更新请求，比如更新个人信息、商品信息全量更新
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 PUT(路由路径,回调函数,路由分组)
	void PUT(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _PUT);
	};
	//@备注 PATCH路由 PUT方法的补充,更新指定资源的部分数据
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 PATCH(路由路径,回调函数,路由分组)
	void PATCH(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _PATCH);
	};
	//@备注 DELETE路由 用于删除指定的资源
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 DELETE_(路由路径,回调函数,路由分组)
	void DELETE_(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _DELETE);
	};
	//@备注 OPTIONS路由 获取服务器支持的HTTP请求方法,服务器性能、跨域检查等
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 OPTIONS(路由路径,回调函数,路由分组)
	void OPTIONS(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _OPTIONS);
	};
	//@备注 CONNECT路由 方法的作用就是把服务器作为跳板，让服务器代替用户去访问其它网页，之后把数据原原本本的返
	// .回给用户，网页开发基本不用这个方法，如果是http代理就会使用这个，让服务器代理用户去访问其他网页，类似中介
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 CONNECT(路由路径,回调函数,路由分组)
	void CONNECT(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _CONNECT);
	};
	//@备注 TRACE路由 回显服务器收到的请求，主要用于测试或诊断
	//@参数 回调函数 参见: Web_回调原型_路由回调
	//@别名 TRACE(路由路径,回调函数,路由分组)
	void TRACE(const char* path, WoHTTPHanderFunc CallFunc, WoHttpGroup* group = NULL) {
		regRouter(path, CallFunc, group, _TRACE);
	};
	//@备注 将本地目录映射到WEB
	//@别名 静态目录(路由路径,本地路径)
	void StaticPath(const char* path, const char*localPath) {
		WoRegisterStaticRouter(m_router,path,localPath);
	}

	//@别名 启动()
	void Run() {
		WoServerRun(m_Server);
	};
	//@别名 停止()
	void Stop() {
		WoServerStop(m_Server);
	};
	//@别名 是否正在运行()
	bool IsRuning() {
		return WoServerIsRuning(m_Server);
	};

	//@备注 404,503,throw等抛出的错误都会进入此回调
	//@参数 回调函数 参见: Web_回调原型_HTTP错误回调
	//@别名 置错误路由(回调函数)
	void SetErrorHandler(WoHTTPHanderErrorFunc func) {
		WoHTTPSetGlobalHandlerError(func);
	}

	//@参数 目录路径 multipart/fromm-data上传的文件的存储路径
	//@别名 置Multipart目录(目录路径)
	bool SetMultipartDir(CXTextA path) {
		return WoServerSetMultipartDir(path);
	}
};

//@别名 Wo取全局服务器()
WEBOAT_MODIFICATION WoServerClass& WEBOAT_API WoGetAppServer();

//@分组}  服务器类

//@解析头文件
#include "WoContext.h"
//@解析头文件
#include "WoLogger.h"

#endif